package practica1.actions;

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;
import practica1.Practica1;
import practica1.controller.Controller;
import practica1.language.Language;
import practica1.language.LanguageEvent;
import practica1.language.LanguageListener;
import practica1.logic.LogicExperimento;
import practica1.logic.LogicPoblacion;
import practica1.ui.simulacion.ThreadSimulacion;
import practica1.util.Utils;

/**
 *
 * @author Miguel González - Ceura
 */
public class ActionSimularPoblaciones  extends AbstractAction implements LanguageListener {
    private LogicExperimento experimento;

    /**
        * Constructor de la clase
        */
    public ActionSimularPoblaciones() {
        super(Language.getI().getP("SIMULAR_POBLACIONES"), null);

        experimento = null;

        putValue(SHORT_DESCRIPTION, Language.getI().getP("SIMULAR_POBLACIONES"));
        putValue(NAME, Language.getI().getP("SIMULAR_POBLACIONES"));
        
        putValue(SELECTED_KEY, Boolean.TRUE);

        initIdiomaListener();
    }

    private void initIdiomaListener() {
        Language.getI().addLanguageListener(this);        
    }

    /**
        * Constructor de la clase que asocia la acción a un experimento
        * @param experimento LogicExperimento Experimento al que se asocia la acción
        */
    public ActionSimularPoblaciones(LogicExperimento experimento) {
        super(Language.getI().getP("SIMULAR_POBLACIONES"), null);

        this.experimento = experimento;

        putValue(SHORT_DESCRIPTION, Language.getI().getP("NUEVA_POBLACION"));
        putValue(NAME, Language.getI().getP("NUEVA_POBLACION"));
        putValue(SELECTED_KEY, Boolean.TRUE);

        initIdiomaListener();
    }

    /**
        * Cuando sucede la acción nos encargamos de crear una nueva población
        * al experimento seleccionado, o bien si la acción está asociada directamente
        * al experimento
        * @param e ActionEvent Evento prtoducido
        */
    @Override
    public void actionPerformed(ActionEvent e) {
        LogicExperimento ex;
        if(experimento != null) {
            ex = experimento;
        } else {
            ex = Controller.getInstance().getExperimentoSeleccionado();
        }

        String ladoPlato = JOptionPane.showInputDialog(
                    Practica1.getInstance(),
                    Language.getI().getP("LADO_PLATO"),
                    Language.getI().getP(
                    "SIMULACION"),
                    JOptionPane.QUESTION_MESSAGE);
                
                if(Utils.esNumero(ladoPlato)) {
                    for(LogicPoblacion poblacion : ex.getPoblaciones()) {
                    if(!poblacion.isSimulando()) {
                        ThreadSimulacion threadSimulacion = 
                                new ThreadSimulacion(poblacion, 
                                Integer.parseInt(ladoPlato));
                        threadSimulacion.addCalculosSimulacionListener(
                                poblacion.getSimulacionBacterias());
                        threadSimulacion.start();
                    }
                }
                } else {
                    JOptionPane.showMessageDialog(
                        Practica1.getInstance(),
                        Language.getI().getP("INTRODUCE_NUMERO_VALIDO"));
                }
        
        
    }

    /**
        * Al cambiar el idioma actualizamos el nombre y la descripción
        * @param evt LanguageEvent
        */
    @Override
    public void idiomaChange(LanguageEvent evt) {
        putValue(SHORT_DESCRIPTION, Language.getI().getP("SIMULAR_POBLACIONES"));
        putValue(NAME, Language.getI().getP("SIMULAR_POBLACIONES"));
    }   
}
